package observer.main.subject;

import observer.main.observer.IObserver;

import java.util.Iterator;
import java.util.Vector;

/**
 * 主题实现类（被观察者）
 */
public class Subject implements ISubject {

    /**
     * 温度
     * （1）高温黄色预警信号：连续三天最高气温35度以上
     * （2）高温橙色预警信号：24小时内最高温度在37度以上
     * （3）高温红色预警信号：24小时内最高气温将升至40度以上
     */
    //温度
    private float temperature;
    //预警级别
    private String warningLevel;
    //保存观察者列表
    private Vector<IObserver> vector;

    public Subject() {
        vector = new Vector<IObserver>();
    }

    /**
     * 增加观察者
     *
     * @param observer
     */
    @Override
    public boolean add(IObserver observer) {
        if (observer != null && !vector.contains(observer)) {
            return vector.add(observer);
        }
        return false;
    }

    /**
     * 删除观察者
     *
     * @param observer
     */
    @Override
    public boolean remove(IObserver observer) {
        return vector.remove(observer);
    }

    /**
     * 通知所有观察者更新数据
     */
    @Override
    public void notifyAllObserver() {
        System.out.println(String.format("===气象部门发布高温%s警报！===", this.warningLevel));
        Iterator<IObserver> iterator = vector.iterator();
        while (iterator.hasNext()) {
            iterator.next().update(this);
        }
    }

    /**
     * 私有方法，根据温度值设置预警级别，然后通知所有观察者
     */
    private void invoke() {
        if (this.temperature >= 35) {
            if (this.temperature >= 35 && this.temperature < 37) {
                this.warningLevel = "黄色";
            } else if (this.temperature >= 37 && this.temperature < 40) {
                this.warningLevel = "橙色";
            } else if (this.temperature >= 40) {
                this.warningLevel = "红色";
            }
            //通知所有观察者温度状况
            this.notifyAllObserver();
        }
    }

    /**
     * 设置温度值
     *
     * @param temperature
     */
    @Override
    public void setTemperature(float temperature) {
        this.temperature = temperature;
        this.invoke();
    }

    /**
     * 获得温度预警
     */
    @Override
    public String temperatureReport() {
        return "温度：" + this.temperature;
    }
}
